package es.mfp.practicos.dao;

import java.util.Date;
import java.util.List;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.googlecode.ehcache.annotations.Cacheable;
import com.googlecode.ehcache.annotations.TriggersRemove;
import com.googlecode.ehcache.annotations.When;

import es.mfp.practicos.domain.Estado;
import es.mfp.practicos.domain.Factura;

@Repository
@SuppressWarnings("unchecked")
public class FacturaDAOImpl extends GenericDaoImpl<Factura, Long> implements
		FacturaDAO {

	@Override
	public Factura findByPK(Long id) {
		List<Factura> res = null;

		res = getJpaTemplate().find(
				" select r from Factura r where r.id = " + id);

		if (res == null || res.isEmpty() || res.size() != 1) {
			throw new IllegalStateException(
					"Error buscando la factura con id: " + id);
		}

		return res.iterator().next();
	}

	@Override
	@Cacheable(cacheName = "facturasCache")
	public List<Factura> getAll() {
		List<Factura> entities = null;

		String s = "SELECT c FROM " + Factura.class.getSimpleName()
				+ " c ORDER BY fechaDesde DESC";
		entities = getJpaTemplate().find(s);

		return entities;
	}

	@Override
	@Cacheable(cacheName = "facturasActivasCache")
	public List<Factura> findActivas() {
		List<Factura> res = null;
		res = getJpaTemplate()
				.find(" select r from Factura r where r.estado = ?1 order by r.fechaDesde DESC",
						Estado.ACTIVO);
		return res;
	}

	@Override
	@Cacheable(cacheName = "fechasDesdeCache")
	public List<Date> findFechasDesde() {
		List<Date> res = null;
		res = getJpaTemplate()
				.find(" select distinct r.fechaDesde from Factura r where r.estado = ?1 order by r.fechaDesde ",
						Estado.ACTIVO);
		return res;
	}

	@Override
	@Cacheable(cacheName = "fechasHastaCache")
	public List<Date> findFechasHasta() {
		List<Date> res = null;
		res = getJpaTemplate()
				.find(" select distinct r.fechaHasta from Factura r where r.estado = ?1 order by r.fechaHasta ",
						Estado.ACTIVO);
		return res;
	}

	@Override
	@Transactional(readOnly = false)
	@TriggersRemove(cacheName = { "fechasHastaCache", "fechasDesdeCache",
			"facturasActivasCache", "facturasCache" }, when = When.BEFORE_METHOD_INVOCATION, removeAll = true)
	public void insert(Factura t) {
		super.insert(t);
	}

	@Override
	@Transactional(readOnly = false)
	@TriggersRemove(cacheName = { "facturasCache", "fechasHastaCache",
			"fechasDesdeCache", "facturasActivasCache", "empleadosCache",
			"empleadosActivosCache" }, when = When.BEFORE_METHOD_INVOCATION, removeAll = true)
	public void update(Factura object) {
		super.update(object);
	}

}
